/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package videorent;

import java.util.Calendar;
import java.util.GregorianCalendar;

/** Representa a un articulo.
 *
 * @author dayi
 */
public class Articulo {

    private String codigo;
    private String nombre;
    private int ano;
    private String estatus;
    private int cantidad;
    private GregorianCalendar fechaDevolucion;

    /** Este es un constructor
     * @param codigo Codigo del articulo
     * @param nombre nombre del articulo
     * @param ano año del articulo
     * @param estatus estatus del articulo
     * @param cantidad cantidad de articulo
     * @param fechaDevolucion fecha de devolucion del articulo
     */
    public Articulo(String codigo, String nombre, int ano, String estatus, int cantidad, GregorianCalendar fechaDevolucion) {
        this.codigo = codigo;
        this.nombre = nombre;
        this.ano = ano;
        this.estatus = estatus;
        this.cantidad = cantidad;
        this.fechaDevolucion = fechaDevolucion;
    }

    /** Este es un constructor sin fecha de devolucion.
     * @param codigo Codigo del articulo
     * @param nombre nombre del articulo
     * @param ano año del articulo
     * @param estatus estatus del articulo
     * @param cantidad cantidad de articulo
     */
    public Articulo(String codigo, String nombre, int ano, String estatus, int cantidad) {
        this.codigo = codigo;
        this.nombre = nombre;
        this.ano = ano;
        this.estatus = estatus;
        this.cantidad = cantidad;
        this.fechaDevolucion = new GregorianCalendar();
    }

    /** Se encarga de devolver el codigo del articulo
     * @return Codigo del articulo
     */
    public String getCodigo() {
        return codigo;
    }

    /** Se encarga de asignar un codigo al articulo
     * @param codigo codigo de articulo
     */
    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    /** Se encarga de devolver el año del articulo
     * @return Año del articulo
     */
    public int getAno() {
        return ano;
    }

    /** Se encarga de establecer el año del articulo
     * @param ano Año del articulo
     */
    public void setAno(int ano) {
        this.ano = ano;
    }

    /** Se encarga de devolver la cantidad del articulo
     * @return cantidad del articulo
     */
    public int getCantidad() {
        return cantidad;
    }

    /** Se encarga de establecer la cantidad del articulo
     * @param cantidad Cantidad del articulo
     */
    public void setCantidad(int cantidad) {
        this.cantidad = cantidad;
    }

    /** Se encarga de devolver el estatus del articulo
     * @return estatus del articulo, en existencia o no.
     */
    public String getEstatus() {
        return estatus;
    }

    /** Se encarga de asignar el estatus del articulo
     * @param estatus estatus del articulo.
     */
    public void setEstatus(String estatus) {
        this.estatus = estatus;
    }

    /** Se encarga de devolver la fecha de devolucion del articulo
     * @return fechaDevolucion del articulo.
     */
    public GregorianCalendar getFechaDevolucion() {
        return fechaDevolucion;
    }

    /** Se encarga de asignar la fecha de devolucion del articulo
     * @param fechaDevolucion fechaDevolucion del articulo.
     */
    public void setFechaDevolucion(GregorianCalendar fechaDevolucion) {
        this.fechaDevolucion = fechaDevolucion;
    }
    
    /** Se encarga de devolver el nombre del articulo
     * @return nombre del articulo.
     */
    public String getNombre() {
        return nombre;
    }
    
    /** Se encarga de asignar el nombre del articulo
     * @param nombre nombre del articulo.
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /** Verifica si se han pasado 30 dias luego de la fecha de devolucion
     * para asumir el articulo como perdido.
     * @param fecha Fecha del dia a comparar
     * @return se declara o no perdido.
     */
    public boolean estaPerdido(GregorianCalendar fecha) {
        GregorianCalendar fd = this.getFechaDevolucion();
        GregorianCalendar fechaConsiderada = (GregorianCalendar) fecha.clone();

        //A partir de la fecha de devolucionle sumo 30
        fd.add(GregorianCalendar.DATE, 30);

        // la fecha del dia esta despues del fd + 30 dias
        return fechaConsiderada.after(fd);
    }

    /** Calcula la diferencia de dias entre el dia a considerar y la fecha de devolucion.
     * @param fecha Ffecha con la que vamos a comparar.
     * @return numero de dias vencido.
     */
    public int diasTieneVencido(GregorianCalendar fecha) {
        GregorianCalendar fd = this.getFechaDevolucion();
        GregorianCalendar fechaConsiderada = (GregorianCalendar) fecha.clone();

        /* Comprobamos que este en el mismo año */
        if (fd.get(Calendar.YEAR) == fechaConsiderada.get(Calendar.YEAR)) {
            return fechaConsiderada.get(Calendar.DAY_OF_YEAR) - fd.get(Calendar.DAY_OF_YEAR);
        } else {
            // Comprobamos si es bisiesto
            int diasAno = fd.isLeapYear(fd.get(Calendar.YEAR)) ? 366 : 365;

            /* Calculamos el rango de los años */
            int rangoAnos = fechaConsiderada.get(Calendar.YEAR) - fd.get(Calendar.YEAR);

            /* Calculamos el rango de dias que hay */
            return ((rangoAnos * diasAno)
                    + (fechaConsiderada.get(Calendar.DAY_OF_YEAR) - fd.get(Calendar.DAY_OF_YEAR)));
        }
    }
}
